package model;

import java.util.*;
import persistent.*;

import persistent.ManagerOnLSD;



public class Fachada {
	private Ficha ficha= null;
	private Investigacion investigacion = null;
	private ManagerOnLSD manager = new ManagerOnLSD();
	private TipoLectura unTL = null;
	
	
// se fija en la base primero que no exista la ficha
	//y luego crea el objeto
	private ManagerOnLSD getManager() {
		if(this.manager == null) {
			this.manager = new ManagerOnLSD();
			return this.manager;
		}
		return this.manager;
	}
	
	public ArrayList existeFicha(String autor, String titulo) {
		ArrayList resultado = this.getManager().get("Ficha", new String[]{"autor", "titulo"}, new String[]{autor, titulo});
		if(resultado == null) {
			return null;
		}
		return resultado;
	}

	private boolean save(Object saveMe) {
		/* <Chanchuyo type="hardcode" reason="timeless">
		 * Porque hago esta chanchada? Porque cuando agrego un objeto Dato, necesito
		 * una referencia a la Ficha a la que pertenece.
		 * Como lo soluciono? Nunca guardo un objeto Dato aislado, sólo los guardo al
		 * mismo tiempo que guardo uno Ficha, así sé a que Ficha pertenece.
		 */
		if(saveMe.getClass().toString() == "Ficha") {
			for(Iterator<persistent.Dato> dato = ((Ficha)saveMe).getDatos().iterator(); dato.hasNext();){
				/* Comento esta línea porque es un despelote.
				 * llamo el método save() del manager, pasandole como primer parámetro
				 * el dato, casteado a Object, y como segundo param un array con los id
				 * en un array de Object casteado a Class, como datos extra, para que se
				 * los asigne a los datos.
				 */
				this.getManager().save(((Object)dato), (Class[])new Object[]{((Ficha)saveMe).getId()});
//				                       ^--- Dato ---^  ^---    Array de IDs casteados a Class    ---^
			}
		}
		/* </Chanchuyo> */
		ManagerOnLSD manager = this.getManager();
		//manager.setEngine("Access");
		return manager.save(saveMe);
	}
	
	private boolean delete(Object deleteMe) {
		ManagerOnLSD manager = this.getManager();
		return manager.delete(deleteMe);
	}
	
	public boolean AltaFicha(String autor, String titulo){
		boolean retorno = false;
		if (existeFicha(autor,titulo)== null){
			Ficha unaF = new Ficha(autor, titulo);
			this.ficha = unaF;
			retorno= true;
		}
		return retorno;

	}
	
	/*public String TituloFicha(Ficha ficha){
		return (ficha.getTitulo());
	}*/
	
	public String getFichaTitulo(Ficha unaf){
		return (unaf.getTitulo());
	}
	
	public Ficha getFicha(){
		return this.ficha;
	}
	//devuelve toda las investigaciones
	public ArrayList getcolInvestigacion(){
		ArrayList retorno = this.getColInvestigacionPersistente();
		
		return retorno;
	}
	// trae de la base de datos toda las investigaciones
	private ArrayList getColInvestigacionPersistente(){
		ArrayList retorno= null;    //programar
		return retorno;
	}
	
	public ArrayList getColAtributo(Ficha unaf){
		return (this.getColAtributoPersistente(unaf));
	}
	// programar
	private ArrayList getColAtributoPersistente(Ficha unaf){ //programar
		ArrayList retorno= null;
		return retorno;
	}
	
	public ArrayList getTipo(){
		return (this.getTipoPersitente());
	}
	
	private ArrayList getTipoPersitente(){
		ArrayList retorno = null; // programar
		return retorno;
	}
	//Guarda en la base de datos una ficha
	public void altaFichaPersistente(Ficha unaF){
		 // programar
		
		
	}
	// se fija en la persistencia si ya existe el tipo de datos
	public boolean existeTipoLectura(String str){
		boolean retorno = false;
		//try y cach
		ArrayList resultado = this.getManager().get("TipoLectura", "nombre", str);
		if (resultado == null){
			retorno = true;
		}
		return retorno;
	}
	
	public boolean altaTipoLectura(String str, Object [] lista){//relanzar execpcion
		boolean retorno = false;
		//TipoLectura nuevoTipo = new TipoLectura();
		//nuevoTipo.setNombre(str);
		this.unTL = new TipoLectura();
		this.unTL.setNombre(str);
		for (int i=0;i<lista.length;i++){
			this.unTL.addColMetadata((Metadata)lista[i]);
		}
		
		retorno = this.save(this.unTL);
		return retorno;
	}
	
	
	
	public ArrayList getColMetadata(){
	// try y cach   y dentro retorno = null;
		//ArrayList retorno = this.getManager().get("Metadata", 1);
		//eliminar esto que es una prueba
	ArrayList retorno = new ArrayList();
		Metadata m1 = new Metadata();
		Metadata m2 = new Metadata();
		Metadata m3 = new Metadata();
		m1.setNombre("capitulo");
		m2.setNombre("parrafo");
		m3.setNombre("paguina");
		retorno.add(m1);
		retorno.add(m2);
		retorno.add(m3);
		return retorno;
	}
	public ArrayList getColMetadata(TipoLectura unTipo){
		return unTipo.getColMetadata();
	}
	
}
